package com.own.component.common.model;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.own.base.BaseResponseCode;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.function.Function;

/**
 * R
 *
 * @author chenxueli
 * @date 2022-06-15 03:14:15
 */
@Schema(title = "返回结果类")
@Getter
@Setter
@Accessors(chain = true)
@ToString
public class R extends BaseResponseModel {

    public static final ResultModel<Boolean> TRUE = success(true);
    public static final ResultModel<Boolean> FALSE = success(false);

    /**
     * 请求成功的响应
     *
     * @param <T> 数据类型
     * @return 响应结果
     */
    public static <T> ResultModel<T> success() {
        return new ResultModel<>();
    }

    /**
     * 请求成功的响应
     *
     * @param data 数据
     * @param <T>  数据类型
     * @return 响应结果
     */
    public static <T> ResultModel<T> success(T data) {
        return new ResultModel<>(data);
    }

    /**
     * 请求成功的响应
     *
     * @param data    数据
     * @param message 消息
     * @param <T>     数据类型
     * @return 响应结果
     */
    public static <T> ResultModel<T> success(T data, String message) {
        return new ResultModel<>(data, message);
    }

    /**
     * 请求成功的响应
     *
     * @param responseCode 响应码
     * @param <T>          数据类型
     * @return 响应结果
     */
    public static <T> ResultModel<T> success(BaseResponseCode responseCode) {
        return new ResultModel<>(responseCode);
    }

    /**
     * 请求成功的响应
     *
     * @param responseCode 响应码
     * @param data         数据
     * @param <T>          数据类型
     * @return 响应结果
     */
    public static <T> ResultModel<T> success(BaseResponseCode responseCode, T data) {
        return new ResultModel<>(responseCode, data);
    }

    /**
     * 请求成功的响应
     *
     * @param model 数据更新的model
     * @param <T>   数据类型
     * @return 响应结果
     */
    public static <T> ResultModel<T> success(UpdateModel<T> model) {
        return new ResultModel<>(model);
    }

    /**
     * 请求失败的响应
     *
     * @param data 数据
     * @param <T>  数据类型
     * @return 响应结果
     */
    public static <T> ResultModel<T> fail(T data) {
        return new ResultModel<>(false, data);
    }

    /**
     * 格式化
     *
     * @param content 内容
     * @param clazz   数据类信息
     * @param <T>     类型
     * @return 响应结果
     */
    public static <T> ResultModel<T> resolveForJson(String content, Class<T> clazz) {
        return resolveForJson(content, object -> object.getObject("data", clazz));
    }

    /**
     * 格式化
     *
     * @param content  内容
     * @param function 执行的方法
     * @param <T>      类型
     * @return 响应结果
     */
    public static <T> ResultModel<T> resolveForJson(String content, Function<JSONObject, T> function) {
        var object = JSON.parseObject(content);
        var model = new ResultModel<T>();
        model.setData(function.apply(object));
        model.setCode(object.getString("code"));
        model.setMessage(object.getString("message"));
        model.setSuccess(object.getBoolean("success"));
        model.setTraceId(object.getString("traceId"));
        var t = object.getString("t");
        model.setT(LocalDateTime.parse(t, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        return model;
    }

}
